package com.cy.wenxinapi.controller;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.cy.wenxinapi.aichat.AIChatService;
import com.cy.wenxinapi.entity.InterviewRecode;
import com.cy.wenxinapi.service.InterviewRecodeService;
import com.cy.wenxinapi.util.InMemoryCacheSingleton;
import com.cy.wenxinapi.util.QA;
import com.cy.wenxinapi.util.R;
import com.cy.wenxinapi.util.Result;
import com.cy.wenxinapi.vo.InterviewParamsVo;
import com.cy.wenxinapi.vo.QAstr;
import com.gearwenxin.entity.response.ChatResponse;
import jakarta.annotation.Resource;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * @author: c
 * @date: 2024/2/25 10:08
 * @description:
 */


@RestController
public class interviewController implements InitializingBean {

    @Resource
    private AIChatService aiChatService;


    //interview question
    @RequestMapping("getInterviewQuestions")
    public void getInterviewQuestions() {

        long startTime = System.currentTimeMillis();
        String question = "你叫什么名字？";
        String aiChatAnswer = aiChatService.getAiChatAnswer(question);
        System.out.println(aiChatAnswer);
        long endTime = System.currentTimeMillis();
        long executionTimeMillis = endTime - startTime;
        System.out.println("程序运行时间：" + executionTimeMillis + "ms");
    }


    @Resource
    private InMemoryCacheSingleton memoryCacheSingleton;

    @Resource
    private InterviewRecodeService interviewRecodeService;

//    static {
//        List<String> objects = new ArrayList<>();
//
//        objects.add("请您介绍一下自己以及您在Java领域的工作经验，包括您使用过的一些主要的Java框架和技术栈。");
//        objects.add("在Java中，垃圾回收是一个非常重要的概念。您能解释一下Java中的垃圾回收机制以及它是如何工作的吗？同时，您能否举例说明哪些情况下可能导致内存泄漏？");
//        objects.add("在并发编程中，我们经常听到'线程安全'这个词汇。请问什么是线程安全，以及Java中提供了哪些机制来保证线程安全？您可以举几个具体的例子来说明吗？");
//        objects.add("请问Java中的异常处理机制是如何工作的？请说明一下try-catch-finally语句块的执行顺序，并谈谈finally块的重要性。同时，您能否给出一些在实际项目中处理异常的最佳实践？");
//        objects.add("在Java中，泛型是一个非常有用的特性。请解释一下泛型的作用以及使用泛型的好处。同时，您能否谈一下Java中的类型擦除以及它在泛型中的应用？");
//        objects.add("请问您对Spring框架有多熟悉？能否谈一下Spring框架的核心特性以及您在实际项目中是如何使用Spring框架的？另外，对于Spring Boot和Spring Cloud这两个流行的项目，您有什么了解和使用经验吗？");
//
//        InterviewParamsVo interviewParamsVo = new InterviewParamsVo();
//        interviewParamsVo.setQuestions(objects);
//        memoryCacheSingleton.put("testInterviewID", interviewParamsVo);
//    }

//    /**
//     * 启动一次interview
//     *
//     * @param vo
//     * @return
//     */
//    @RequestMapping("getInterviewID")
//    public Result getInterviewID(@RequestBody InterviewParamsVo vo) {
//        String InterviewID = interviewRecodeService.generateInterviewID();
//        vo.setInterviewId(InterviewID);
//
//        memoryCacheSingleton.put(InterviewID, vo);
////        //使用一个异步线程去生成面试题
////        new Thread(() -> {
////            if (ObjectUtil.isNotEmpty(vo)) {
////                String prompt = aiChatService.getPrompt(vo, 6);
////                String aiChatAnswer = aiChatService.getAiChatAnswer(prompt);// prompt就是标准化的question
////                List<String> aiChatAnswerJSONList = aiChatService.getAiChatAnswerJSONList(aiChatAnswer);
////                vo.setQuestions(aiChatAnswerJSONList);
////            }
////        }).start();
//
//        return Result.ok(InterviewID);
//    }


    @RequestMapping("getOneQuestionForInterviewByIndex")
    public Result getInterviewID(String InterviewID, Integer index) {

        InterviewParamsVo vo = (InterviewParamsVo) memoryCacheSingleton.get(InterviewID);
        if (ObjectUtil.isNotEmpty(vo)) {
            String s = vo.getQuestions().get(index);
            return Result.ok(s);
        }
        return Result.ok();
    }


    @RequestMapping("testInterviewID")
    public Result getInterviewID(String InterviewID) {

        InterviewParamsVo vo = (InterviewParamsVo) memoryCacheSingleton.get(InterviewID);
        System.out.println(vo);

        return Result.ok("请您介绍一下自己以及您在Java领域的工作经验，包括您使用过的一些主要的Java框架和技术栈。");
    }


//z

    /**
     * 获取题目序号（需要执行6次）
     *
     * @param num 题目数量
     * @return
     */
    @RequestMapping("getQuestionForInterviewold")
//    @RequestMapping("getQuestionForInterviewNew")
    public Result firstQuestionForInterview(Integer num, String interviewId) {
        List<String> objects = new ArrayList<>();

        objects.add("请您介绍一下自己以及您在Java领域的工作经验，包括您使用过的一些主要的Java框架和技术栈。");
        objects.add("在Java中，垃圾回收是一个非常重要的概念。您能解释一下Java中的垃圾回收机制以及它是如何工作的吗？同时，您能否举例说明哪些情况下可能导致内存泄漏？");
        objects.add("在并发编程中，我们经常听到'线程安全'这个词汇。请问什么是线程安全，以及Java中提供了哪些机制来保证线程安全？您可以举几个具体的例子来说明吗？");
        objects.add("请问Java中的异常处理机制是如何工作的？请说明一下try-catch-finally语句块的执行顺序，并谈谈finally块的重要性。同时，您能否给出一些在实际项目中处理异常的最佳实践？");
        objects.add("在Java中，泛型是一个非常有用的特性。请解释一下泛型的作用以及使用泛型的好处。同时，您能否谈一下Java中的类型擦除以及它在泛型中的应用？");
        objects.add("请问您对Spring框架有多熟悉？能否谈一下Spring框架的核心特性以及您在实际项目中是如何使用Spring框架的？另外，对于Spring Boot和Spring Cloud这两个流行的项目，您有什么了解和使用经验吗？");

        return Result.ok(objects);


//        if (num == 520) {
//
//            objects.add("请您介绍一下自己以及您在Java领域的工作经验，包括您使用过的一些主要的Java框架和技术栈。");
//            objects.add("在Java中，垃圾回收是一个非常重要的概念。您能解释一下Java中的垃圾回收机制以及它是如何工作的吗？同时，您能否举例说明哪些情况下可能导致内存泄漏？");
//            objects.add("在并发编程中，我们经常听到'线程安全'这个词汇。请问什么是线程安全，以及Java中提供了哪些机制来保证线程安全？您可以举几个具体的例子来说明吗？");
//            objects.add("请问Java中的异常处理机制是如何工作的？请说明一下try-catch-finally语句块的执行顺序，并谈谈finally块的重要性。同时，您能否给出一些在实际项目中处理异常的最佳实践？");
//            objects.add("在Java中，泛型是一个非常有用的特性。请解释一下泛型的作用以及使用泛型的好处。同时，您能否谈一下Java中的类型擦除以及它在泛型中的应用？");
//            objects.add("请问您对Spring框架有多熟悉？能否谈一下Spring框架的核心特性以及您在实际项目中是如何使用Spring框架的？另外，对于Spring Boot和Spring Cloud这两个流行的项目，您有什么了解和使用经验吗？");
//
//            return Result.ok(objects);
//        }
//
//
//        InterviewParamsVo vo = (InterviewParamsVo) memoryCacheSingleton.get(interviewId);
//
//        if (ObjectUtil.isNotEmpty(vo)) {
//
//            String uestionPrompt = aiChatService.getQuestionPrompt(vo);
//
//            String aiChatAnswer = aiChatService.getAiChatAnswer(uestionPrompt);// prompt就是标准化的question
//            List<String> strings = extractQuestions(aiChatAnswer);
//            if (strings.size() == 0) {
//                strings = extractQuestion(aiChatAnswer);
//            }
//
////            List<String> aiChatAnswerJSONList = aiChatService.getAiChatAnswerJSONList(aiChatAnswer);
//            return Result.ok(strings);
//
//        }


//        List<QA> objects = new ArrayList<>();
//        if (num == 520) {
//
//
//
//            for (int i = 0; i < 6; i++) {
//                QA qa = new QA();
//                qa.setQuestion("请您介绍一下自己以及您在Java领域的工作经验，包括您使用过的一些主要的Java框架和技术栈。");
//                objects.add(qa);
//            }
//
//
//
//            return Result.ok(objects);
//        }
//
//        String prompt = aiChatService.getPrompt("第一次面试题目", num);
//        String aiChatAnswer = aiChatService.getAiChatAnswer(prompt);// prompt就是标准化的question
//        List<String> aiChatAnswerJSONList = aiChatService.getAiChatAnswerJSONList(aiChatAnswer);
//        for (String s : aiChatAnswerJSONList) {
//            QA qa = new QA();
//            qa.setQuestion(s);
//            objects.add(qa);
//        }
//
//        return Result.ok(objects);
    }


    public static List<String> extractQuestion(String text) {
        List<String> questions = new ArrayList<>();
        // 按行分开
        JSONArray jsonArray = JSON.parseArray(text.replace("```json", "").replace("```", "").replaceAll("\n", ""));

        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject = jsonArray.getJSONObject(i);

            // 提取问题字段的值，并添加到问题列表中
            if (jsonObject.containsKey("问题")) {
                String question = jsonObject.getString("问题");
                questions.add(question);
            }
        }

        return questions;
    }





    public static void main(String[] args) {
        String aiAnswer222 = "基于您提供的岗位需求和候选人的简历，以下是针对“销售培训生”岗位的面试问题：\n" +
                "\n" +
                "**专业技能类问题：**\n" +
                "\n" +
                "1. **【专业技能类】+在您的过往经历中，您是如何通过市场分析来制定销售策略的？请具体举例说明。+【岗位相关】**\n" +
                "   \n" +
                "   * 此问题旨在了解候选人是否具备市场分析能力和销售策略制定的经验。\n" +
                "\n" +
                "2. **【专业技能类】+在维护客户关系的过程中，您通常采取哪些措施来深化与客户的关系，并挖掘新的需求？+【岗位相关】**\n" +
                "   \n" +
                "   * 此问题考察候选人在客户关系管理和需求挖掘方面的能力。\n" +
                "\n" +
                "3. **【专业技能类】+请描述一次您成功处理客户售后问题的经历，并说明您采取了哪些步骤来解决问题。+【岗位相关】**\n" +
                "   \n" +
                "   * 此问题用于评估候选人在售后服务和问题解决方面的能力。\n" +
                "\n" +
                "**行为类面试问题：**\n" +
                "\n" +
                "1. **【行为类】+在您的学生会体育部部长任期内，您面临过哪些挑战？您是如何应对这些挑战的？+【简历相关】**\n" +
                "   \n" +
                "   * 此问题旨在了解候选人在团队合作和领导角色中的表现。\n" +
                "\n" +
                "2. **【行为类】+请谈谈在安桥（中国）商贸有限公司市场部实习期间，您参与的一个数字营销项目，并说明您在该项目中的具体贡献。+【简历相关】**\n" +
                "   \n" +
                "   * 此问题用于评估候选人在数字营销领域的实际经验和团队合作能力。\n" +
                "\n" +
                "3. **【行为类】+在您之前的工作和实习经历中，有没有哪次经历让您觉得特别有成就感？请详细描述一下。+【简历相关】**\n" +
                "   \n" +
                "   * 此问题旨在了解候选人的职业动机和成就感来源，同时考察其自我反思和表达能力。\n" +
                "\n" +
                "这些问题结合了岗位需求和候选人的简历，旨在全面评估候选人在销售培训生岗位上的潜力和适应性。";
        String text = "根据您提供的销售培训生职位描述、岗位要求以及大学生的简历，以下是针对该岗位的6个可能的面试问题：\n" +
                "\n" +
                "1. **专业技能类**：根据您在上海大众汽车和安桥（中国）商贸有限公司的实习经验，您如何理解客户关系管理在销售中的重要性？您能否分享一个您成功维护或深化客户关系的实例？【岗位相关】\n" +
                "\n" +
                "2. **专业技能类**：在您之前的实习中，您参与过哪些市场营销活动？能否具体说明您如何协助团队达成营销目标，并描述您在这些活动中所承担的角色和学到的技能？【岗位相关】\n" +
                "\n" +
                "3. **行为类**：在您学生会体育部部长的任职期间，您面临过哪些挑战？您是如何克服这些挑战的，并从中获得了哪些个人成长？【简历相关】\n" +
                "\n" +
                "4. **专业技能类**：请谈谈您对销售行业的了解，特别是针对我们公司的业务领域。您认为销售培训生应具备哪些关键技能，以及您如何证明自己具备这些技能？【岗位相关】\n" +
                "\n" +
                "5. **行为类**：在您的多次实习经历中，您是否有过一次必须处理客户投诉或售后问题的经历？请描述该情况，并说明您是如何解决问题的。【岗位相关】\n" +
                "\n" +
                "6. **行为类**：在您的工作或学习经历中，有没有哪次您提出了一个创新的想法或解决方案，并成功实施的例子？请分享这个过程和结果。【简历相关】";

//        List<String> strings = extractQuestions(text);
        List<String> strings1 = extractQuestion(text);
        System.out.println(strings1);
    }

    private static List<String> extractQuestions(String text) {
        List<String> questionsList = new ArrayList<>();
        StringBuilder currentQuestion = new StringBuilder();

        boolean isReadingQuestion = false;

        // 遍历文本中的每个字符
        for (char c : text.toCharArray()) {
            if (c == '+' && !isReadingQuestion) {
                // 当遇到'+'时，开始读取新的问题
                isReadingQuestion = true;
            } else if ((c == '+' || c == '\n') && isReadingQuestion) {
                // 当遇到下一个'+'或换行符，并且正在读取问题时，结束当前问题并添加到列表中
                questionsList.add(currentQuestion.toString().trim());
                currentQuestion.setLength(0); // 清空StringBuilder
                isReadingQuestion = false;
            } else if (isReadingQuestion) {
                // 如果正在读取问题，则继续添加字符
                currentQuestion.append(c);
            }
        }

        // 添加最后一个可能未被终止符截断的问题
        if (currentQuestion.length() > 0) {
            questionsList.add(currentQuestion.toString().trim());
        }

        return questionsList;
    }


    public static void main2(String[] args) {
        String text = "根据您提供的信息，我将为您设计6个面试问题，其中3个为专业技能类问题，3个为行为类问题，并确保其中4个与岗位需求直接相关，2个与大学生的简历相关。\n" +
                "\n" +
                "**专业技能类问题：**\n" +
                "\n" +
                "1. **【专业技能类】**+在您的过往经历中，您是如何通过市场分析来制定销售策略的？请具体举例说明。+**【岗位相关】**\n" +
                "\n" +
                "2. **【专业技能类】**+在维护客户关系的过程中，您通常采取哪些措施来深化与客户的关系，并挖掘新的需求？+**【岗位相关】**\n" +
                "\n" +
                "3. **【专业技能类】**+请描述一次您成功处理客户售后问题的经历，并说明您采取了哪些步骤来解决问题。+**【岗位相关】**\n" +
                "\n" +
                "**行为类面试问题：**\n" +
                "\n" +
                "1. **【行为类】**+在您的学生会体育部部长任期内，您面临过哪些挑战？您是如何应对这些挑战的？+**【简历相关】**\n" +
                "\n" +
                "2. **【行为类】**+请谈谈在安桥（中国）商贸有限公司市场部实习期间，您参与的一个数字营销项目，并说明您在该项目中的具体贡献。+**【简历相关】**\n" +
                "\n" +
                "3. **【行为类】**+在您之前的工作和实习经历中，有没有哪次经历让您觉得特别有成就感？请详细描述一下。+**【简历相关】**";

        // 使用正则表达式匹配问题
        String[] lines = text.split("\n+");
        for (String line : lines) {
            if (line.matches("\\d+\\.\\s+【.+】")) {
                String questionLine = line.replaceFirst("\\d+\\.\\s+【.+】\\+\\s+", "");
                System.out.println(questionLine);
            }
        }
    }

    /**
     * 提交问题答案
     *
     * @param interviewRecode
     * @return
     */
    @RequestMapping("commitQuestionAnswer")
    public Result commitQuestionAnswer(@RequestBody InterviewRecode interviewRecode) {
        interviewRecode.setCreateTime(new Date());
        interviewRecodeService.commitquestionAnswer(interviewRecode);
        return Result.ok();
    }


    @RequestMapping("commitQuestionAnswerList")
    public Result commitQuestionAnswerList(@RequestBody List<InterviewRecode> interviewRecodeList) {

//        HashMap<String, String> questionList = new HashMap<>();

        List<QA> questionList = new ArrayList<>();


        //数据入库
        for (InterviewRecode interviewRecode : interviewRecodeList) {

            questionList.add(new QA(interviewRecode.getQuestion(), interviewRecode.getAnswer()));
            interviewRecode.setCreateTime(new Date());
//            interviewRecodeService.commitquestionAnswer(interviewRecode);
        }

        String jsonString = JSON.toJSONString(questionList);

//        String aiChatAnswer = aiChatService.getAiChatAnswer(jsonString);// prompt就是标准化的question

        return Result.ok();
    }


    /**
     * 重新提交答案
     *
     * @param interviewRecode
     * @return
     */
    @RequestMapping("updateQuestionAnswer")
    public Result updateQuestionAnswer(@RequestBody InterviewRecode interviewRecode) {
        interviewRecode.setCreateTime(new Date());
        interviewRecodeService.updateQuestionAnswer(interviewRecode);
        return Result.ok();
    }


    @RequestMapping("getOverallRatingold")
    public R getOverallRating(@RequestBody QAstr qAstr) {

//        return interviewRecodeService.getOverallRating(InterviewID);
        String jsonString = JSON.toJSONString(qAstr.getMsg());
        interviewRecodeService.getResultUpdate(jsonString, qAstr.getInterviewId());
        return interviewRecodeService.getResult(jsonString, qAstr.getInterviewId());


    }


    @RequestMapping("getAdvanceAnswer")
    public R getAdvanceAnswer(String interviewID) {
        Collection<Map.Entry<String, Object>> byPrefix = memoryCacheSingleton.getByPrefix(interviewID);
        return R.ok().put("data", byPrefix);
    }


    @Override
    public void afterPropertiesSet() throws Exception {
        InterviewParamsVo interviewParamsVo = new InterviewParamsVo();
        interviewParamsVo.setInterviewId("1");
        interviewParamsVo.setJob("销售培训生");
        interviewParamsVo.setName("销售培训生面试");
        interviewParamsVo.setRequirement("职位描述\n" +
                "1. 根据市场情况，开拓所负责地区相关品类的整体方案销售，参与合同的谈判和签订；\n" +
                "2. 维系并深化现有客户关系，挖掘客户需求，促成新订单；\n" +
                "3. 了解客户状态，及时更新、维护、分析客户数据，并据此制定执行行动计划\n" +
                "4. 负责客户订单的跟踪，交付，回款等，并处理售后问题；\n" +
                "5. 聚焦当前中国市场最具活力的行业和头部客户，为他们在未来零售的争夺中脱颖\n" +
                "而出提供战略支持；\n" +
                "6. 以营销服务和创意为抓手，强大的供应链管理为基石，拉动物料的生产和管理，为客\n" +
                "户提供全链条的产品和服务。\n" +
                "岗位要求 1. 本科及以上学历，出版、印包专业优先；\n" +
                "2. 具备良好的沟通能力，有良好的人际敏锐度；\n" +
                "3. 有较强的抗压能力、积极乐观有韧性；\n" +
                "4. 对市场有比较高的敏锐度，较强的逻辑思维能力及学习能力\n" +
                "5. 有开拓市场的热情，享受解决问题的成就感，有想象力，想法和点子层出不穷");
        interviewParamsVo.setExperience("社会经历\n" +
                "2022 年 7 月-2022 年 8 月，上海大众汽车（售后服务营销与客户关系管理科）\n" +
                "协助维护斯柯达互动社区；协助管理车友汇微博 完成售后服务营销团队其他日常任\n" +
                "务；\n" +
                "2021 年 6 月-2022 年 3 月，安桥（中国）商贸有限公司（市场部） 维护品牌官方\n" +
                "微博，监督平台品牌露出度并与粉丝进行积极互动，增强消费者对品牌的信任； 协助完\n" +
                "成网站搜索引擎优化（SEO），研究品牌关键词，对官网及产品页文字内容进行\n" +
                "优化；协助各种数字营销项目，包括电子邮件营销（EDM）；付费搜索竞价广告（PPC）投放；\n" +
                "百度百科，百度网盟推广等；官网网站日常维护； 协助线上线下客户关系管理活动的执\n" +
                "行； 2020 年12 月-2021 年2 月，戴德梁行（企业服务部） 搜集相关市场信息，\n" +
                "制作各类报表并进行数据处理； 负责公司资料库的信息核对、更新、管理工作能准确理\n" +
                "解客户需求，并搜集和推荐合适物业 2020 年7 月-2020 年8 月，\n" +
                "复旦附中国际部（招生办） 每天打 50 个陌生电话拜访潜在客户，询问入学需要， 约\n" +
                "见有需求的学生家长； 接待来访外籍家长，介绍学校概况，协助其完成报名、考试、入学\n" +
                "等流程； 信息录入等相关工作 2019 年1 月-2019 年2 月，上海学联旅行\n" +
                "社实习（国内部） 带领各校学生旅游团在上海及周边地区短途旅游，磨练了我的耐心\n" +
                "与责任心，提高了人际沟通能力；\n" +
                "校园经历\n" +
                "2022 年 5 月-至今，学生会体育部部长\n" +
                "2021 年 5 月-2022 年 5 月，学生会体育部干事\n" +
                "2020 年 4 月-至今，极限社干事");

        memoryCacheSingleton.put("1", interviewParamsVo);
    }
}
